Go 跟其他語言不太一樣,就是沒有 classes,但是可以自己在型別上定義 method
method 簡單來說就是一個帶有 接受器 (receiver) 參數的 function
下面我們就來實際操作看看吧~
package main
import "fmt"
type Album struct {
ID int
Name string
Artist string
Year int
}
func (a Album) GetName() string {
return a.Name
}
func main() {
album := Album{
ID: 1,
Name: "KILL MY DOUBT",
Artist: "ITZY",
Year: 2023,
}
fmt.Println(album.GetName())
}
在前面第 8 天介紹 struct 的時候有說過,struct 是 Go 實現物件導向很重要的要素
(除了 struct 跟 method 外,還有後面兩天會介紹的 functions、interface)
首先,我們先建立一個 Album struct
type Album struct {
ID int
Name string
Artist string
Year int
}
接著建立一個 帶有 Album struct 的 receiver function GetName() string
這個 GetName() string
function 的用途是回傳專輯名稱
func (a Album) GetName() string {
return a.Name
}
宣告一個變數 album
來初始化 Album 物件
最後透過變數 album
來使用 Album 物件作為 receiver 的 GetName() string
function
func main() {
album := Album{
ID: 1,
Name: "KILL MY DOUBT",
Artist: "ITZY",
Year: 2023,
}
fmt.Println(album.GetName())
}
method 中的 receiver 並不要求是 struct,也可以是自己定義的型別,或是我們前一天介紹的 pointers 指標
像是 A Tour of Go 上的兩個官方範例
package main
import (
"fmt"
"math"
)
// MyFloat 是自己定義的型別
type MyFloat float64
// Abs 是 MyFloat 的 Method
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
} else {
return float64(f)
}
}
func main() {
f := MyFloat(-math.Sqrt2)
fmt.Println(f.Abs())
}
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
// Abs 是 Vertex 的 Method
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
// Scale 是 *Vertex 的 Method
func (v *Vertex) Scale(f float64) {
v.X *= f
v.Y *= f
}
func main() {
v := Vertex{3, 4}
v.Scale(10)
fmt.Println(v.Abs())
}
今天簡單介紹了 Go 的 method 用法
下一篇會來介紹同為 Go 用來實現物件導向的 interface
明天見~